home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Reference Guide
/
C-C++ Interactive Reference Guide.iso
/
c_ref
/
csource5
/
332_01
/
newwin.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-07
|
6KB
|
205 lines
/****************************************************************/
/* Newwin(), subwin() routines of the PCcurses package */
/* */
/****************************************************************/
/* This version of curses is based on ncurses, a curses version */
/* originally written by Pavel Curtis at Cornell University. */
/* I have made substantial changes to make it run on IBM PC's, */
/* and therefore consider myself free to make it public domain. */
/* Bjorn Larsson (bl@infovox.se) */
/****************************************************************/
/* 1.4: References to win->borderchar[] removed due to */
/* re-defined border() functions. Use of short */
/* wherever possible. Bug in subwin() did not */
/* allow subwin to be the same size as the origi- */
/* nal window. Portability improvements: 900114 */
/* 1.3: MSC '-W3', Turbo'C' '-w -w-pro' checks. */
/* Support for border(), wborder() functions: 881005 */
/* 1.2: Other max limits off by 1. Fixed thanks to */
/* S. Creps: 881002 */
/* 1.1: Fix in subwin: '+/-1' error when checking that */
/* subwindow fits in parent window: 880305 */
/* 1.0: Release: 870515 */
/****************************************************************/
#include <stdio.h>
#include <curses.h>
#include <curspriv.h>
char _curses_newwin_rcsid[] = "@(#)newwin.c v.1.4 - 900114";
extern char *malloc();
extern char *calloc();
extern void free();
/****************************************************************/
/* Makenew() allocates all data for a new window except the */
/* actual lines themselves. */
/****************************************************************/
static WINDOW *makenew(num_lines, num_columns, begy, begx)
int num_lines;
int num_columns;
int begy;
int begx;
{
short i;
WINDOW *win;
/* allocate the window structure itself */
if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL)
return ((WINDOW *) ERR);
/* allocate the line pointer array */
if ((win->_line = (short **) calloc(num_lines, sizeof (short *))) == NULL)
{
free(win);
return((WINDOW *) ERR);
}
/* allocate the minchng and maxchng arrays */
if ((win->_minchng = (short *) calloc(num_lines, sizeof(short))) == NULL)
{
free(win);
free(win->_line);
return((WINDOW *) ERR);
}
if ((win->_maxchng = (short *) calloc(num_lines, sizeof(short))) == NULL)
{
free(win);
free(win->_line);
free(win->_minchng);
return((WINDOW *) ERR);
}
/* initialize window variables */
win->_curx = 0;
win->_cury = 0;
win->_maxy = num_lines;
win->_maxx = num_columns;
win->_begy = begy;
win->_begx = begx;
win->_flags = 0;
win->_attrs = ATR_NRM;
win->_tabsize = 8;
win->_clear = (bool) ((num_lines == LINES) && (num_columns == COLS));
win->_leave = FALSE;
win->_scroll = FALSE;
win->_nodelay = FALSE;
win->_keypad = FALSE;
win->_regtop = 0;
win->_regbottom = num_lines - 1;
/* init to say window unchanged */
for (i = 0; i < num_lines; i++)
{
win->_minchng[i] = 0;
win->_maxchng[i] = num_columns-1;
}
/* set flags for window properties */
if ((begy + num_lines) == LINES)
{
win->_flags |= _ENDLINE;
if ((begx == 0) && (num_columns == COLS) && (begy == 0))
win->_flags |= _FULLWIN;
} /* if */
if (((begy + num_lines) == LINES)
&&
((begx + num_columns) == COLS))
win->_flags |= _SCROLLWIN;
return(win);
} /* makenew */
/****************************************************************/
/* Newwin() creates a new window with size num_lines * num_co- */
/* lumns, and origin begx,begy relative to the SCREEN. Special */
/* case: if num_lines and/or num_columns is 0, the remainder of */
/* the screen is used. */
/****************************************************************/
WINDOW *newwin(num_lines, num_columns, begy, begx)
int num_lines;
int num_columns;
int begy;
int begx;
{
WINDOW *win;
short *ptr;
short i, j;
if (num_lines == 0)
num_lines = LINES - begy;
if (num_columns == 0)
num_columns = COLS - begx;
if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
return((WINDOW *) ERR);
for (i = 0; i < num_lines; i++) /* make and clear the lines */
{
if((win->_line[i] = (short *) calloc(num_columns,sizeof(short))) == NULL)
{
for (j = 0; j < i; j++) /* if error, free all the data */
free(win->_line[j]);
free(win->_minchng);
free(win->_maxchng);
free(win->_line);
free(win);
return((WINDOW *) ERR);
} /* if */
else
for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns;)
*ptr++ = ' ' | ATR_NRM;
} /* for */
return(win);
} /* newwin */
/****************************************************************/
/* Subwin() creates a sub-window in the 'orig' window, with */
/* size num_lines * num_columns, and with origin begx, begy */
/* relative to the SCREEN. Special case: if num_lines and/or */
/* num_columns is 0, the remainder of the original window is */
/* used. The subwindow uses the original window's line buffers */
/* to store it's own lines. */
/****************************************************************/
WINDOW *subwin(orig, num_lines, num_columns, begy, begx)
WINDOW *orig;
int num_lines, num_columns, begy, begx;
{
WINDOW *win;
short i, j, k;
/* make sure window fits inside the original one */
if (
begy < orig->_begy ||
begx < orig->_begx ||
(begy + num_lines) > (orig->_begy + orig->_maxy) ||
(begx + num_columns) > (orig->_begx + orig->_maxx)
)
return((WINDOW *) ERR);
if (num_lines == 0)
num_lines = orig->_maxy - (begy - orig->_begy);
if (num_columns == 0)
num_columns = orig->_maxx - (begx - orig->_begx);
if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
return((WINDOW *) ERR);
/* set line pointers the same as in the original window */
j = begy - orig->_begy;
k = begx - orig->_begx;
for (i = 0; i < num_lines; i++)
win->_line[i] = (orig->_line[j++]) + k;
win->_flags |= _SUBWIN;
return(win);
} /* subwin */